﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIMCObjetoNegocio;
using SIMCFachadaNegocio;
using SIMCPresenter.Parametros;

namespace SIMCPresenter
{
    public interface IPermisosPortafolioView : ISeguridadPermisosPortafolioView
    {
        event EventHandler<EventArgs> Iniciar;
        event EventHandler<EventArgs> Aprobar;
        event EventHandler<EventArgs> Rechazar;
        event EventHandler<EventArgs> Inactivar;
        event EventHandler<EventArgs> Solicitar;
        event EventHandler<EventArgs> Renovar;
        event EventHandler<SearchEventArgs<AliasParametros>> GuardarAlias;

        PortafolioDeUsuario ViewData { get; set; }
        List<PortafolioPermiso> ListaDePermisos { get; set; }
                
        int IdPortafolio { get; }
        int IdPortafolioUsuario { get; }
    }

    public interface ISeguridadPermisosPortafolioView : ISeguridadView
    {
        bool PuedeAprobar { get; set; }
        bool PuedeRechazar { get; set; }
        bool PuedeInactivar { get; set; }
        bool PuedeSolicitar { get; set; }
        bool PuedeRenovar { get; set; } 
    }

    public class PermisosPortafolioPresenter : PresenterBase
    {
        private IPermisosPortafolioView m_View;
        private FachadaPortafolio m_FachadaPortafolio;

        public PermisosPortafolioPresenter(IPermisosPortafolioView view)
            : base(view)
        {
            m_FachadaPortafolio = new FachadaPortafolio();
            this.m_View = view;
            this.Initialize();
        }

        private void Initialize()
        {
            this.m_View.Iniciar += new EventHandler<EventArgs>(mView_Iniciar);
            this.m_View.Aprobar += new EventHandler<EventArgs>(mView_Aprobar);
            this.m_View.Rechazar += new EventHandler<EventArgs>(mView_Rechazar);
            this.m_View.Inactivar += new EventHandler<EventArgs>(mView_Inactivar);
            this.m_View.Solicitar += new EventHandler<EventArgs>(mView_Solicitar);
            this.m_View.Renovar += new EventHandler<EventArgs>(mView_Renovar);
            this.m_View.GuardarAlias += new EventHandler<SearchEventArgs<AliasParametros>>(m_View_GuardarAlias);
        }

        private void m_View_GuardarAlias(object sender, SearchEventArgs<AliasParametros> e)
        {
            try
            {
                m_FachadaPortafolio.GuardarAlias(e.Element.IdPortafolioUsuario, e.Element.Alias);
                IniciarFormulario();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        
        private void mView_Iniciar(object sender, EventArgs e)
        {
            try
            {
                IniciarFormulario();                
            }
            catch (Exception ex)
            {
                m_View.MostrarMensaje(ex.Message, false);
            }
        }

        private void IniciarFormulario()
        {
            m_View.ListaDePermisos = m_FachadaPortafolio.BuscarListaPermiso();            

            int idPortafolioUsuario = m_View.IdPortafolioUsuario;
            
            m_View.ViewData = m_FachadaPortafolio.BuscarAsociacion(idPortafolioUsuario);

            ConfigurarEstados();
        }

        private void ConfigurarEstados()
        {
            if (m_View.ViewData != null)
            {
                switch (m_View.ViewData.Estado)
                {
                    case EstadoPortafolioUsuario.Aprobado:
                        m_View.PuedeAprobar = false;
                        m_View.PuedeRechazar = false;
                        m_View.PuedeSolicitar = false;
                        m_View.PuedeInactivar = m_View.PuedeInactivar ? true : false;
                        m_View.PuedeRenovar = m_View.PuedeRenovar ? true : false;
                        break;

                    case EstadoPortafolioUsuario.Inactivo:
                    case EstadoPortafolioUsuario.Rechazado:
                        m_View.PuedeAprobar = false;
                        m_View.PuedeRechazar = false;
                        m_View.PuedeSolicitar = false;
                        m_View.PuedeInactivar = false;
                        m_View.PuedeRenovar = m_View.PuedeRenovar ? true : false;
                        break;

                    case EstadoPortafolioUsuario.Nuevo:
                        m_View.PuedeAprobar = false;
                        m_View.PuedeRechazar = false;
                        m_View.PuedeInactivar = false;
                        m_View.PuedeRenovar = false;
                        m_View.PuedeSolicitar = m_View.PuedeSolicitar ? true : false;
                        break;

                    case EstadoPortafolioUsuario.Solicitado:
                        m_View.PuedeSolicitar = false;
                        m_View.PuedeInactivar = false;
                        m_View.PuedeRenovar = false;
                        m_View.PuedeAprobar = m_View.PuedeAprobar ? true : false;
                        m_View.PuedeRechazar = m_View.PuedeRechazar ? true : false;
                        break;
                }
            }
        }        

        private void CambiarEstado(PortafolioDeUsuario p_Objeto, Action<PortafolioDeUsuario> p_Estado)
        {
            if (p_Objeto != null)
            {
                p_Estado(p_Objeto);
                IniciarFormulario();
            }
            else
            {
                m_View.MostrarMensaje(string.Format("Debe seleccionar un usuario"), false);
            }
        }

        private void mView_Solicitar(object sender, EventArgs e)
        {
            try
            {
                CambiarEstado(m_View.ViewData, m_FachadaPortafolio.SolicitarPermisos);                
            }
            catch (Exception ex)
            {
                m_View.MostrarMensaje(ex.Message, false);
            }
        }

        private void mView_Aprobar(object sender, EventArgs e)
        {
            try
            {
                CambiarEstado(m_View.ViewData, m_FachadaPortafolio.AprobarPermisos);
            }
            catch (Exception ex)
            {
                m_View.MostrarMensaje(ex.Message, false);
            }
        }

        private void mView_Rechazar(object sender, EventArgs e)
        {
            try
            {
                CambiarEstado(m_View.ViewData, m_FachadaPortafolio.RechazarPermisos);
            }
            catch (Exception ex)
            {
                m_View.MostrarMensaje(ex.Message, false);
            }
        }

        private void mView_Inactivar(object sender, EventArgs e)
        {
            try
            {
                CambiarEstado(m_View.ViewData, m_FachadaPortafolio.InactivarPermisos);                
            }
            catch (Exception ex)
            {
                m_View.MostrarMensaje(ex.Message, false);
            }
        }

        private void mView_Renovar(object sender, EventArgs e)
        {
            try
            {
                CambiarEstado(m_View.ViewData, m_FachadaPortafolio.RenovarPermisos);
            }
            catch (Exception ex)
            {
                m_View.MostrarMensaje(ex.Message, false);
            }
        }
    }
}
